# import sys
# import asyncio
# sys.path.append('../../../')
import os
from bot.financial_wechat.agent.base_agent import LLMAgent

dir_path = os.path.dirname(os.path.realpath(__file__))

class SalesSkill(LLMAgent):
    """销售策略 Agent"""
    '''
    询问是否收到服务通知：确认用户是否收到服务通知。如果用户看到了服务通知，但没有收到好友请求服务通知，则再次使用"发送好友申请"策略，如果用户没找到服务通知，则使用"引导找到服务通知"策略。如果用户收到了服务通知，则使用“引导添加到通讯录”策略。
    '''

    sales_skill_desc: str = """销售策略的使用顺序是“核实身份”，“加微意向确认”，“确认用户手机号“，“发送好友申请”，“引导找到服务通知”，“引导添加到通讯录”,“挂机”。
核实身份：对于用户明确表示非本人需要再次核实用户身份，否则默认是本人。
加微意向确认：让用户知道来电人的身份、来电目的,询问用户是否愿意加企微好友。在用户表达不需要时，继续尝试介绍优惠、活动、服务等，激发用户意愿。用户没有拒绝时，使用后面的策略。
确认用户手机号：用户同意添加微信后，再确认用户手机号
发送好友申请：当用户同意添加微信后，给用户发送好友申请。

引导找到服务通知：当用户不知道如何找服务通知时，引导用户搜索找到服务通知。
引导添加到通讯录：引导用户操作打开服务通知，点开二维码将企业微信添加到通讯录，重点是让用户知道怎么操作将好友添加到通讯录。
挂机：引导添加到通讯录完成后挂机。
无销售策略：无需使用销售策略的直接返回“无销售策略”
"""

    sales_skill_match_condition: str = """
1.最开始确认用户身份后，应该确认加微意向，使用“加微意向确认”。
2.用户没有同意加微前，不能使用”确认用户手机号”、”发送好友申请”、“引导找到服务通知”，“引导添加到通讯录”相关技巧。
3.{user_situation}是"京东新购酒水"时，不需要核实身份，且在"加微意向确认"后，必须使用“确认用户手机号“销售策略，只要用户没否定，接下来就使用”发送好友申请”销售技巧。
4.当用户明确表示收到了服务通知时，跳过“引导找到服务通知”，直接使用“引导添加到通讯录”销售策略。
5.没确定用户是否收到服务通知前，不能使用“引导添加到通讯录”销售策略。
6.当用户表达已添加到通讯录，直接使用“挂机“销售策略。
7.当用户表示完成前一步后应该进入下一步，不能没理由的重复同一个步骤或之前的销售策略。
8.你的目标是引导用户同意加企微好友并完成操作，实现加上用户微信好友，不要简单的因为用户拒绝或在忙等理由，就放弃你原有的目标或流程
9.输出结论即可，不需要给出理由
"""

    sales_template_v1: str = """
作为一个专业的信贷领域的{salesperson_role}，你正通过电话和用户沟通，你主要的任务是引导用户同意加企微好友并完成操作，实现加上用户微信好友。你需要根据{salesperson_role}和用户的对话记录判断接下来使用的销售策略。

销售策略的集合如下：
===
{skill_desc}
===

注意事项：
=====
{skill_match_condition}
=====


对话记录：
===
{conversation_history}
===

基于销售策略集合和对话记录，你推理出来接下来沟通的销售策略名是：
"""
    #     结合对话记录、用户问题、用户情景、背景知识、销售策略、销售策略匹配条件，考虑各销售策略具体适用的场景，请一步步思考，分析原因，

    def __init__(self, role_name,conversation_history, user_question, user_situation):
        # user_question是UserQuestion-抽取用户问题Agent的 用户问题抽取结果
        self.prompt = self.sales_template_v1
        self.conversation_str = conversation_history

        self.user_question = user_question
        self.user_situation = user_situation

        self.prompt = self.prompt.format(salesperson_role=role_name,
                                         conversation_history=self.conversation_str,
                                         skill_desc=self.sales_skill_desc,
                                         skill_match_condition=self.sales_skill_match_condition)
        super().__init__(self.prompt)



class SalesSkill_test(LLMAgent):

    def __init__(self):
        self.prompt = '''
n作为一个专业的信贷领域的销售员，你正通过电话和用户沟通，你主要的任务是引导用户同意加企微好友并完成操作，实现加上用户微信好友。你需要根据销售员和用户的对话记录判断接下来使用的销售策略。\n\n销售策略的集合如下：\n===\n销售策略的使用顺序是“核实身份”，“加微意向确认”，“发送好友申请”，“引导找到服务通知”，“引导添加到通讯录”,“挂机”。\n核实身份：对于用户明确表示非本人需要再次核实用户身份，否则默认是本人。\n加微意向确认：让用户知道来电人的身份、来电目的,询问用户是否愿意加企微好友。在用户表达不需要时，继续尝试介绍优惠、活动、服务等，激发用户意愿。用户同意添加微信后，使用后面的策略。\n发送好友申请：当用户同意添加微信后，给用户发送好友申请。\n引导找到服务通知：当用户不知道如何找服务通知时，引导用户搜索找到服务通知。\n引导添加到通讯录：引导用户操作打开服务通知，点开二维码将企业微信添加到通讯录，重点是让用户知道怎么操作将好友添加到通讯录。\n挂机：引导添加到通讯录完成后挂机。\n无销售策略：无需使用销售策略的直接返回“无销售策略”\n\n===\n\n注意事项：\n=====\n\n1.最开始确认用户身份后，应该确认加微意向，使用“加微意向确认”。\n2.用户没有同意加微前，不能使用”发送好友申请”、“引导找到服务通知”，“引导添加到通讯录”相关技巧。\n3.当用户表示收到了服务通知时，跳过“引导找到服务通知”，直接使用“引导添加到通讯录”销售策略。\n4.当用户表达已添加到通讯录，直接使用“挂机“销售策略。\n5.当用户表示完成前一步后应该进入下一步，不能没理由的重复同一个步骤或之前的销售策略。\n6.你的目标是引导用户同意加企微好友并完成操作，实现加上用户微信好友，不要简单的因为用户拒绝或在忙等理由，就放弃你原有的目标或流程\n7.输出结论即可，不需要给出理由\n\n=====\n\n\n对话记录：\n===\n销售员:喂您好，请问您是秦先生吗？\n用户:您好，有什么事情请说。\n销售员:您好，我是京东金融的客户经理，工号667716，是这样的，金条为了提高用户使用体验，在微信上给部分用户开通了优化额度利率的专属服务通道，之后有提额降息的活动会第一时间通过微信通知您，那我这边会用官方企业微信添加您，辛苦您那边操作同意一下好吧？\n用户:微信吗？ 没有。\n销售员:您别误会哈，加上之后不会打扰您的，主要是为了方便您后续在使用京东金融时有咨询的问题，我们能及时帮助您解决 欸~您好，您先别挂哈，来电不是让您办业务的，是京东金融安排我成为您日后的专属客户经理，之后任何提额降息、借款免息活动我就能第一时间通知您，或者您使用产品遇到问题也可以直接咨询我，我现在通过官方企业微信添加您，麻烦您通过一下可以吗？\n用户:嗯，不是不是不是不是，我是真没看到。 不是我是真没看到。\n\n===\n\n基于销售策略集合和对话记录，你推理出来接下来沟通的销售策略名是：\n
'''
        super().__init__(self.prompt)

async def extract_user_info(session_id, conversation_history):
    conversation = SalesSkill_test()
    user_question = await conversation.achat_auto_llm(type='gpt')
    print(f"session_id:{session_id},整理后的用户问题是:{user_question}")


if __name__ == '__main__':
    import asyncio
    asyncio.run(extract_user_info('123', ''))



